package h0810;

import java.util.Scanner;

public class MooncakeDistribution {
    static int m;
    static int n;
    static int maxDiff = 3;
    static int ans = 0;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        m = sc.nextInt();   //员工人数
        n = sc.nextInt();   //月饼数量
        getCount();
        System.out.println(ans);
    }

    private static void getCount() {
        if (m == 1) {
            System.out.println(1);
        } else {
            recrusive(0, 1, n / m, n);
        }
    }

    private static void recrusive(int level, int min, int max, int remain) {
        if (level == m - 1) {
            //分到最后一个员工时，我们应该将剩余月饼都给他
            //因此最后一个员工的月饼数量就是remain,而倒数第二个员工的月饼数量是min(本轮递归的min参数，即上一轮员工分得的月饼数量)
            //如果二者的差距不超过maxDiff,则分月饼方案可行
            if (remain - min < maxDiff) {
                ans++;
            }
            return;
        }

        //i是当前员工可以分得的月饼数量
        for (int i = min; i <= max; i++) {
            //下一个员工至少分得i个月饼(当前员工分得的月饼数量)，至多分得i+maxDiff
            //同时下一个员工分得的月饼数量不能超过：均分月饼数量（即剩余月饼总数/剩余员工总数），否则破坏去重策略（为了保证月饼的方案不重复，我们这里保证后面员工分得的月饼数不小于前面员工）
            remain -= i;
            recrusive(level + 1, i, Math.min(i + maxDiff, remain / (m - level - 1)), remain);
            remain+=i;
        }
    }
}
